package proyecto.dao;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.Medico;
import proyecto.modelo.MedicoPK;

public class MedicoDAOImpl extends HibernateDaoSupport implements MedicoDAO {

    protected Log log = LogFactory.getLog(getClass());

    @SuppressWarnings("unchecked")
    public List<Medico> buscarPorDni(String dni) throws DAOExcepcion {

        log.info("buscarPorDni() : " + dni);

        List<Medico> arreglo = new ArrayList<Medico>();
        try {
            arreglo = getHibernateTemplate().find(
                    "from Medico a where trim(a.dni) like ?",
                    "%" + dni + "%");
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        }
        return arreglo;
    }

    @SuppressWarnings("unchecked")
    public List<Medico> listar() throws DAOExcepcion {
        log.info("listar()");
        List<Medico> lista = new ArrayList<Medico>();
        try {
            lista = getHibernateTemplate().find("from Medico");
        } catch (DataAccessException e) {
            log.error(e.toString());
            throw new DAOExcepcion(e.getMessage());
        }
        return lista;
    }

    public Medico obtener(int codigoMedico)
            throws DAOExcepcion {
        log.info("obtener() : " + codigoMedico);
        Medico modelo = new Medico();
        try {
            modelo = (Medico) getHibernateTemplate().find(
                    "from Medico a where trim(a.codigoMedico) = ?",
                    codigoMedico+"").get(0);
        } catch (Exception e) {
            log.error("Error: " +e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        }
        return modelo;
    }

    public Medico actualizar(Medico modelo) throws DAOExcepcion {
        try {
            getHibernateTemplate().update(modelo);
            getHibernateTemplate().flush();
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        }
        return modelo;
    }

    public Medico insertar(Medico modelo) throws DAOExcepcion {
        try {
            getHibernateTemplate().save(modelo);
            getHibernateTemplate().flush();
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        }
        return modelo;
    }

    public void eliminar(int codigoMedico) throws DAOExcepcion {
        Medico modelo = new Medico();
        modelo.getMedicoPK().setCodigoMedico(codigoMedico);
        try {
            getHibernateTemplate().delete(modelo);
            getHibernateTemplate().flush();
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        }
    }
}
